/**
 * 版权所有 2009-2012山东新北洋信息技术股份有限公司
 * 保留所有权利。
 */
package com.linyaonan.leetcode.easy._447;

import java.util.HashMap;

/**
 * 给定平面上 n 对不同的点，“回旋镖” 是由点表示的元组 (i, j, k) ，其中 i 和 j 之间的距离和 i 和 k 之间的距离相等（需要考虑元组的顺序）。
 * <p>
 * 找到所有回旋镖的数量。你可以假设 n 最大为 500，所有点的坐标在闭区间 [-10000, 10000] 中。
 * <p>
 * 示例:
 * <p>
 * 输入:
 * [[0,0],[1,0],[2,0]]
 * <p>
 * 输出:
 * 2
 * <p>
 * 解释:
 * 两个回旋镖为 [[1,0],[0,0],[2,0]] 和 [[1,0],[2,0],[0,0]]
 *
 * @ProjectName: leetcode
 * @Package: com.linyaonan.leetcode.easy._447
 * @ClassName: NumberOfBoomerangs
 * @Author: linyaonan
 * @Date: 2019/12/30 14:37
 */
public class NumberOfBoomerangs {

    public int n(int[][] points) {
        HashMap<Integer, Integer> hashMap = new HashMap<>();
        int count = 0;
        for (int i = 0; i < points.length; i++) {
            hashMap.clear();
            for (int j = 0; j < points.length; j++) {
                if (i == j) {
                    continue;
                }
                int distance = (points[i][0] - points[j][0]) * (points[i][0] - points[j][0]) + (points[i][1] - points[j][1]) * (points[i][1] - points[j][1]);
                count += hashMap.getOrDefault(distance, 0) * 2;
                hashMap.put(distance, hashMap.getOrDefault(distance, 0) + 1);
            }
        }
        return count;
    }

    public int numberOfBoomerangs(int[][] points) {

        if (points.length <= 1) {
            return 0;
        }
        int count = 0;
        // 三重循环遍历三组数据
        for (int i = 0; i < points.length; i++) {
            for (int j = 0; j < points.length; j++) {
                for (int z = 0; z < points.length; z++) {
                    if (i != j && j != z && z != i) {
                        int[] first = points[i];
                        int[] second = points[j];
                        int[] third = points[z];
                        long one = getPointLine(first, second);
                        long two = getPointLine(first, third);
                        if (one == two) {
                            count++;
                        }
                    }
                }
            }
        }
        return count;
    }

    private long getPointLine(int[] first, int[] second) {
        return (long) Math.pow((second[0] - first[0]), 2) + (long) Math.pow((second[1] - first[1]), 2);
    }

}
